import qiniu
from qiniu import Auth, put_data
from django.conf import settings
import uuid
import os


class QiniuStorage:
    def __init__(self):
        self.access_key = settings.QINIU["ACCESS_KEY"]
        self.secret_key = settings.QINIU["SECRET_KEY"]
        self.bucket_name = settings.QINIU["BUCKET_NAME"]
        self.domain = settings.QINIU["DOMAIN"]
        
        # 检查域名配置
        if self.domain == "xxx.bkt.clouddn.com" or not self.domain:
            raise ValueError("请在settings.py中配置正确的七牛云域名（QINIU['DOMAIN']）")
        
        # 确保域名包含协议
        if not self.domain.startswith('http'):
            self.domain = f"https://{self.domain}"
        
        self.q = Auth(self.access_key, self.secret_key)

    def generate_key(self, file_name, user_id):
        """生成唯一文件名（避免重复）"""
        # 格式：user_{用户ID}/idcard_{正面/背面}_{随机UUID}.ext
        ext = os.path.splitext(file_name)[1].lower()  # 获取文件后缀
        unique_name = f"user_{user_id}/idcard_{uuid.uuid4().hex}{ext}"
        return unique_name

    def upload_file(self, file_data, file_name, user_id, side):
        """
        上传文件到七牛云
        :param file_data: 文件二进制数据（如request.FILES.get('file').read()）
        :param file_name: 原始文件名
        :param user_id: 用户ID（用于目录隔离）
        :param side: "front"（正面）/ "back"（背面）
        :return: 文件访问URL（私有空间需带签名）
        """
        # 生成带前缀的文件名（区分用户和正反面）
        key = f"user_{user_id}/idcard_{side}_{uuid.uuid4().hex}{os.path.splitext(file_name)[1].lower()}"

        # 上传文件
        token = self.q.upload_token(self.bucket_name, key, 3600)  # 令牌有效期3600秒
        ret, info = put_data(token, key, file_data)

        if ret is None or ret["key"] != key:
            raise Exception(f"七牛云上传失败：{info}")

        # 生成私有文件的临时访问URL（有效期3600秒，可按需调整）
        private_url = f"{self.domain}/{key}"
        signed_url = self.q.private_download_url(private_url, expires=3600)
        return signed_url, key  # 返回带签名的URL和存储键（用于后续删除或更新）